#include"../source/tcp_server.hpp"

// void test_1()
// {
//     Socket sock;
//     sock.CreateServer("0.0.0.0",8989);

//     while(1)
//     {
//         int fd = sock.Accept();
//         if(fd < 0)
//         {
//             continue;
//         }
//         else
//         {
//             Socket tmp(fd);
//             while(1)
//             {
//                 char buffer[1024] = {0};
//                 ssize_t size  = tmp.Recv(buffer,1023);
//                 if(size < 0)
//                 {
//                     tmp.Close();
//                 }
//                 LOG(LogLevel::DEBUG)<<"size:" <<size <<"buffer :" << buffer;
//                 tmp.Send(buffer,size);
//             }
//         }
//     }

// }


// // EventLoop loop;
// // LoopThreadPool *loop_thread_pool;

// void HandlerClose(Channel* channel)
// {
//     LOG(LogLevel::DEBUG) << "close : " << channel->Fd();
//     channel->Remove();
//     close(channel->Fd());

//     //这里有坑，如果释放了，监控事件的值会变化，就会走进
//     //channel->SetEvent(0);
//     //delete channel;
// }

// void HandlerRead(Channel* channel)
// {
//     int fd = channel->Fd();
//     char buffer[1024] = {0};
//     int n = recv(fd,buffer,1023,0);
//     if(n == 0)
//     {
//         HandlerClose(channel);
//         return;
//     }
//    // LOG(LogLevel::DEBUG)<<"开始写事件监控";
//     LOG(LogLevel::DEBUG)<<buffer;
//     channel->EnableWrite();
// }

// void HandlerWrite(Channel* channel)
// {
//     int fd = channel->Fd();
//     std::string in = "hello word";
//     int n = send(fd,in.c_str(),in.size(),0);
//     if(n < 0)
//     {
//         HandlerClose(channel);
//     }

//     channel->RelieveWrite();
// }

// void HandlerError(Channel* channel)
// {
//     HandlerClose(channel);
// }

// void HandelerEvent(EventLoop* _loop, uint64_t id)
// {
//     _loop->RefreshTask(id);
// }

// std::unordered_map<uint64_t, ConnectionPtr> _conns;
// uint64_t conn_id = 0;

// void ConnectionDestroy(const ConnectionPtr &conn) {
//     std::cout << " id : " << conn->Id() << std::endl;
//     _conns.erase(conn->Id());
// } 


// int tl_index = 0;

// void NewConn(int new_sockfd)
// {
//     // int _sockfd = channel->Fd();
//     // int new_sockfd = accept(_sockfd,nullptr,nullptr);
//     // if(new_sockfd < 0)
//     // {
//     //     LOG(LogLevel::ERROR) << "accept error ...";
//     // }

//     // Channel * newchannel  = new Channel(new_sockfd,_loop);
//     // newchannel->SetReadCallback(std::bind(&HandlerRead,newchannel));
//     // newchannel->SetWriteCallback(std::bind(&HandlerWrite,newchannel));
//     // newchannel->SetCloseCallback(std::bind(&HandlerClose,newchannel));
//     // newchannel->EnableRead();
//     // _loop->TimerAdd(timer_id,10,std::bind(&HandlerClose,newchannel));
//     //tl_index = (++tl_index) % 2;
//     //LOG(LogLevel::DEBUG)<< " loop_thread_pool->GetEventLoop() : " << loop_thread_pool->GetEventLoop();
//     ConnectionPtr conn(std::make_shared<Connection>(conn_id,new_sockfd,loop_thread_pool->GetEventLoop()));
//     conn->SetMessageCallback(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2));
//     conn->SetServerClosedCallback (std::bind(ConnectionDestroy, std::placeholders::_1));
//     conn->SetConnectedCallback(std::bind(OnConnected, std::placeholders::_1));
//     conn->EnableInactiveRelease(10);//启动非活跃超时销毁
//     conn->Established();//就绪初始化
//     _conns.insert(std::make_pair(conn_id, conn));
//    // LOG(LogLevel::DEBUG) <<"---------------------------- :" <<tl_index;

//     ++conn_id;
// }

// void test_2()
// {
//     loop_thread_pool = new LoopThreadPool(&loop);
//     loop_thread_pool->SetThreadCount(2);
//     loop_thread_pool->Create();
//     Accept apt(&loop,8181);
//     apt.SetAcceptCallback(std::bind(&NewConn,std::placeholders::_1));
//     apt.Listen();
//     loop.Start();
// }

void OnConnected(const  ConnectionPtr &conn) {
    LOG(LogLevel::DEBUG)<<" OnConnected conn.get() : " <<  conn.get();
 }
//  void OnMessage(const  ConnectionPtr &conn, Buffer *buf) {
//      LOG(LogLevel::DEBUG) << buf->ReadStringPop(buf->ReadSize());
//      std::string str = "Hello World";
//      conn->Send(str.c_str(), str.size());
//     // conn->ShutDwon();
//  }

void OnMessage(const ConnectionPtr &conn, Buffer *buf)
{
    //LOG(LogLevel::DEBUG) << buf->ReadStringPop(buf->ReadSize());
    conn->Send(buf->ReadPtr(), buf->ReadSize());
    buf->ReadIndexSkewing(buf->ReadSize());
    //conn->ShutDwon();
}
 
 void OnClosed(const ConnectionPtr &conn) {
     LOG(LogLevel::DEBUG)<<" OnClosed conn.get() : " <<  conn.get();
 }

 void TmpTask()
 {
    LOG(LogLevel::DEBUG) <<"我是一个临时任务";
 }

void test_3()
{
    TcpServer server(8989);
    server.SetThreadCount(2);
    server.OpenTimeout(10);
    server.SetClosedCallback(OnClosed);
    server.SetConnectedCallback(OnConnected);
    server.SetMessageCallback(OnMessage);
    //server.RunAfter(&TmpTask,5);
    server.Start();
}

int main()
{
  
    //test_1();
    //test_2();
    test_3();
    return 0;
}